#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> counter(0); // 初始化原子计数器

void increment()
{
    for (int i = 0; i < 10000; ++i)
    {
        // 原子操作是指在执行过程中不会被其他线程中断的操作
        counter.fetch_add(1, std::memory_order_relaxed); // 原子增加
    }
}

int main()
{
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Final counter value: " << counter << std::endl; // 输出最终的计数器值

    return 0;
}
// 常用原子操作
// store/desired  load()
// exchange()  compare_exchange_weak/strong()
// fetch_add/sub/or/and/xor  wait/notify_one/notify_all(C++20)

// 防止编译器、处理器优化、缓存一致性
// C++ 标准里为 std::atomic 提供了 6 种内存序标识符，按“强度”从最强到最轻罗列如下：
// std::memory_order_seq_cst 顺序一致性（全局总序，默认）
// std::memory_order_acq_rel 获取-释放（读时 acquire，写时 release）
// std::memory_order_acquire 获取（读同步）
// std::memory_order_release 释放（写同步）
// std::memory_order_consume 消费（依赖同步，C++20 起已弃用/弱化）
// std::memory_order_relaxed 仅保证原子性，不保证顺序